iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 8

30 天了解 Swift 的 Combine: [08] Publisher 延展類:Subject

  • 分享至 

  • xImage
  •  

Subject 是一種特殊的 Publisher, protocol Subjectprotocol Publisher 的繼承類:

protocol Subject : AnyObject, Publisher 
Subject.send()
Subject.send(subscription:)
Subject.send(completion:)

特別注意, 不同於 Publisher, Subject 透過 AnyObjcet, 限制了 Reference type.

如果 一個事件流要用特別的方式介入, Suject 就是這個 inject 的載體, 也因此可以快速的將原本的非 Combine 的程式改寫套用. 若是熟係設計模式, Subject 以實作觀察者模式來理解會比較直接.

Subject 在 Combine 有兩個實作類別:

final class PassthroughSubject<Output, Failure> where Failure : Error

final class CurrentValueSubject<Output, Failure> where Failure : Error

PassthroughtSubject 的文件很簡易的解釋他與 CurrentValueSubject 的差別

Unlike CurrentValueSubject, a PassthroughSubject doesn’t have an initial value or a buffer of the most recently-published element.
PassthroughSubject 和 CurrentValueSubject 幾乎一樣,只是沒有初始值,也不會保存任何值。

PassthroughSubject 是一個相近於 NotificationCenter 的模式, 透過 .send() 可以控制結束或是發送 Value, 很容易入門且濫用.

CurrentValueSubject 相對於 PassthroughSubject, 是沒有.send(), 取而代之的是一個真真確確的 value, 就像是 didSet 的方式, 就像 if then 的方式.

簡單測驗:

  1. 建立一個固定泛型的 Subject, 例如 IntNeverPassthroughSubject(提示 final class)
  2. CurrentValueSubject 如何發出 Error?

上一篇
30 天了解 Swift 的 Combine: [07] 被封裝的 Subscriber
下一篇
30 天了解 Swift 的 Combine: [09] Operator 目錄 + 第一部分:轉換類型
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言